layui.define(['layer', 'table'], function (exports) {
  var $ = layui.jquery
  var layer = layui.layer
  var table = layui.table

  var treetable = {
    // 渲染树形表格
    render: function (param) {
      // 检查参数
      if (!treetable.checkParam(param)) {
        return
      }
      // 获取数据
      if (param.data) {
        treetable.init(param, param.data)
      } else {
        $.getJSON(param.url, param.where, function (res) {
          treetable.init(param, res.data)
        })
      }
    },
    // 渲染表格
    init: function (param, data) {
      var mData = []
      var doneCallback = param.done
      var tNodes = data
      // 补上id和pid字段
      for (var i = 0; i < tNodes.length; i++) {
        var tt = tNodes[i]
        if (!tt.id) {
          if (!param.treeIdName) {
            layer.msg('参数treeIdName不能为空', { icon: 5 })
            return
          }
          tt.id = tt[param.treeIdName]
        }
        if (!tt.pid) {
          if (!param.treePidName) {
            layer.msg('参数treePidName不能为空', { icon: 5 })
            return
          }
          tt.pid = tt[param.treePidName]
        }
      }

      // 对数据进行排序
      var sort = function (s_pid, data) {
        for (var i = 0; i < data.length; i++) {
          if (data[i].pid == s_pid) {
            var len = mData.length
            if (len > 0 && mData[len - 1].id == s_pid) {
              mData[len - 1].isParent = true
            }
            mData.push(data[i])
            sort(data[i].id, data)
          }
        }
      }
      sort(param.treeSpid, tNodes)

      // 重写参数
      param.url = undefined
      param.data = mData
      param.page = {
        count: param.data.length,
        limit: param.data.length
      }
      param.cols[0][param.treeColIndex].templet = function (d) {
        var mId = d.id
        var mPid = d.pid
        var isDir = d.isParent
        var emptyNum = treetable.getEmptyNum(mPid, mData)
        var iconHtml = ''
        for (var i = 0; i < emptyNum; i++) {
          iconHtml += '<span class="treeTable-empty"></span>'
        }
        if (isDir) {
          iconHtml += '<i class="layui-icon layui-icon-triangle-d"></i> <i class="layui-icon layui-icon-layer"></i>'
        } else {
          iconHtml += '<i class="layui-icon layui-icon-file"></i>'
        }
        iconHtml += '&nbsp;&nbsp;'
        var ttype = isDir ? 'dir' : 'file'
        var vg = '<span class="treeTable-icon open" lay-tid="' + mId + '" lay-tpid="' + mPid + '" lay-ttype="' + ttype + '">'
        return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '</span>'
      }

      param.done = function (res, curr, count) {
        $(param.elem).next().addClass('treeTable')
        $('.treeTable .layui-table-page').css('display', 'none')
        $(param.elem).next().attr('treeLinkage', param.treeLinkage)
        // 绑定事件换成对body绑定
        /* $('.treeTable .treeTable-icon').click(function () {
                    treetable.toggleRows($(this), param.treeLinkage);
                }); */
        if (param.treeDefaultClose) {
          treetable.foldAll(param.elem)
        }
        if (doneCallback) {
          doneCallback(res, curr, count)
        }
      }

      // 渲染表格
      table.render(param)
    },
    // 计算缩进的数量
    getEmptyNum: function (pid, data) {
      var num = 0
      if (!pid) {
        return num
      }
      var tPid
      for (var i = 0; i < data.length; i++) {
        if (pid == data[i].id) {
          num += 1
          tPid = data[i].pid
          break
        }
      }
      return num + treetable.getEmptyNum(tPid, data)
    },
    // 展开/折叠行
    toggleRows: function ($dom, linkage) {
      var type = $dom.attr('lay-ttype')
      if (type == 'file') {
        return
      }
      var mId = $dom.attr('lay-tid')
      var isOpen = $dom.hasClass('open')
      if (isOpen) {
        $dom.removeClass('open')
      } else {
        $dom.addClass('open')
      }
      $dom.closest('tbody').find('tr').each(function () {
        var $ti = $(this).find('.treeTable-icon')
        var pid = $ti.attr('lay-tpid')
        var ttype = $ti.attr('lay-ttype')
        var tOpen = $ti.hasClass('open')
        if (mId == pid) {
          if (isOpen) {
            $(this).hide()
            if (ttype == 'dir' && tOpen == isOpen) {
              $ti.trigger('click')
            }
          } else {
            $(this).show()
            if (linkage && ttype == 'dir' && tOpen == isOpen) {
              $ti.trigger('click')
            }
          }
        }
      })
    },
    // 检查参数
    checkParam: function (param) {
      if (!param.treeSpid && param.treeSpid != 0) {
        layer.msg('参数treeSpid不能为空', { icon: 5 })
        return false
      }

      if (!param.treeColIndex && param.treeColIndex != 0) {
        layer.msg('参数treeColIndex不能为空', { icon: 5 })
        return false
      }
      return true
    },
    // 展开所有
    expandAll: function (dom) {
      $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
        var $ti = $(this).find('.treeTable-icon')
        var ttype = $ti.attr('lay-ttype')
        var tOpen = $ti.hasClass('open')
        if (ttype == 'dir' && !tOpen) {
          $ti.trigger('click')
        }
      })
    },
    // 折叠所有
    foldAll: function (dom) {
      $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
        var $ti = $(this).find('.treeTable-icon')
        var ttype = $ti.attr('lay-ttype')
        var tOpen = $ti.hasClass('open')
        if (ttype == 'dir' && tOpen) {
          $ti.trigger('click')
        }
      })
    }
  }

  layui.link(layui.cache.base + 'treetable-lay/treetable.css')

  // 给图标列绑定事件
  $('body').on('click', '.treeTable .treeTable-icon', function () {
    var treeLinkage = $(this).parents('.treeTable').attr('treeLinkage')
    if (treeLinkage == 'true') {
      treetable.toggleRows($(this), true)
    } else {
      treetable.toggleRows($(this), false)
    }
  })

  exports('treetable', treetable)
})
